package recursivecode;

import java.util.Stack;

/**
 * 功能描述:反向堆栈
 * 2024/07/11
 *
 * @author ZhangYi
 */
public class ReverseStack {
	public static void main(String[] args) {
		Stack<String> stack = new Stack<>();
		stack.push("a");
		stack.push("b");
		stack.push("c");
		stack.push("d");
		stack.push("e");
		stack = reverseStack(stack);

		System.out.println("栈反转后的结果为");
		while (!stack.isEmpty()){
			System.out.println(stack.pop());
		}
	}

	private static Stack<String> reverseStack(Stack<String> stack) {
		if (stack.isEmpty()){
			return new Stack<>();
		}

		String result = getLastElementAndRemoveElementFromStack(stack);
		reverseStack(stack);
		stack.push(result);
		return stack;
	}

	private static String getLastElementAndRemoveElementFromStack(Stack<String> stack) {
		if (stack.size() == 1){
			// 如果栈中,只剩一个元素, 就直接返回同时,清空栈
			return stack.pop();
		}
		// 清空栈至最后一个元素
		String element = stack.pop();
		// 获取栈底的元素
		String result = getLastElementAndRemoveElementFromStack(stack);
		// 除了最后一个元素，其他元素都重新压入栈中
		stack.push(element);

		// 返回栈底的结果
		return result;
	}
}
